package ar.uba.fi.algo3.tp3.vista;

import ar.uba.fi.algo3.tp3.modelo.ObservadorPuntos;
import ar.uba.fi.algo3.tp3.modelo.ObservadorVidas;
import ar.uba.fi.algo3.tp3.modelo.Partida;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import ar.uba.fi.algo3.titiritero.SuperficieDeDibujo;
import ar.uba.fi.algo3.titiritero.vista.Panel;
import ar.uba.fi.algo3.tp3.controlador.ControladorPacman;
import ar.uba.fi.algo3.tp3.controlador.TecladoController;
import ar.uba.fi.algo3.tp3.modelo.Persistidor;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionListener;
import javax.swing.plaf.basic.BasicSplitPaneUI.BasicVerticalLayoutManager;
import sun.awt.VerticalBagLayout;

public class VentanaPrincipal extends Frame implements ObservadorPuntos, ObservadorVidas {

    private ControladorPacman controladorPacman;
    private static final long serialVersionUID = 1L;
    private static Dialog cuadroError;
    private Panel panel;
    private Label etiquetaPuntos;
    private Label etiquetaVidas;
    private Label etiquetaEstado;


    public VentanaPrincipal(ControladorPacman unControladorJuego) {
        this.controladorPacman = unControladorJuego;
        this.setTitle("Pacman");
        this.setSize(700, 510);
        this.setResizable(false);
        this.setLayout(null);

        panel = new Panel(510, 480, controladorPacman);
        this.add(panel);
        panel.setBackground(Color.black);
        panel.setLocation(0, 25);

        crearPanelBotones();

        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });

        panel.addKeyListener(new TecladoController(this.controladorPacman));
    }

    private void crearPanelBotones() {
        Panel panelBotones = new Panel(190, 480, controladorPacman);
        this.add(panelBotones);
        panelBotones.setBackground(Color.lightGray);
        panelBotones.setLocation(510, 25);
        panelBotones.setLayout(new GridLayout(10, 1));

        Button botonNuevo   = new Button("Nueva partida");
        Button botonSalir   = new Button("Salir");
        Button botonPausa   = new Button("Pausa");
        Button botonGuardar = new Button("Guardar partida");
        Button botonCargar  = new Button("Cargar partida");

        panelBotones.add(botonNuevo);
        panelBotones.add(botonSalir);
        panelBotones.add(botonPausa);
        panelBotones.add(botonGuardar);
        panelBotones.add(botonCargar);

        crearEtiquetas(panelBotones);

        botonPausa.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ControladorPacman.getInstance().cambiarEstadoPausa();
            }
        });

        botonSalir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        botonNuevo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Partida.getInstance().nuevaPartida();
            }
        });
        
        botonGuardar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Persistidor.guardarJuego();
            }
        });

        botonCargar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Persistidor.cargarJuego();
            }
        });
    }

    private void crearEtiquetas(Panel panel) {
        etiquetaPuntos = new Label("Puntaje: 0", 1);
        etiquetaPuntos.setFont(new Font("SansSerif", 0, 20));
        panel.add(etiquetaPuntos);

        etiquetaVidas = new Label("Vidas: 3", 1);
        etiquetaVidas.setFont(new Font("SansSerif", 0, 20));
        panel.add(etiquetaVidas);

        etiquetaEstado = new Label(" ", 1);
        etiquetaEstado.setFont(new Font("SansSerif", 0, 20));
        panel.add(etiquetaEstado);
    }

    public void cambioEnPuntos(int p) {
        Integer puntos = p;
        this.etiquetaPuntos.setText("Puntaje: " + puntos.toString());
    }

    public void cambioVidas(int v) {
        Integer vidas = v;
        this.etiquetaVidas.setText("Vidas: " + vidas.toString());
        if (vidas == 0) {
            this.etiquetaEstado.setText("Perdiste el juego!");         
        }else
        	this.etiquetaEstado.setText(" ");
    }

    public SuperficieDeDibujo getSuperficieDeDibujo() {
        return this.panel;
    }

    public static void mostrarError(String error) {
        cuadroError = new Dialog(VentanaPrincipal.getWindows()[0], "Error");
        cuadroError.setLayout(new GridLayout(2,1));
        cuadroError.setSize(300, 120);
        cuadroError.setLocation(100, 100);
        cuadroError.add(new Label(error));
        Button b = new Button("Cerrar");
        cuadroError.add(b);
        cuadroError.setVisible(true);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                VentanaPrincipal.ocultarError();
            }
        });
    }

    public static void ocultarError() {
        if(cuadroError != null) {
            cuadroError.setVisible(false);
            cuadroError = null;
        }
    }
}
